package com.wuliwu.autoapi.bean;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * MAP类型的结果对象
 *
 * @author Sujun
 */
@Data
public class Result{

    /**
     * 是否成功，默认成功
     */
    private boolean success = true;

    /**
     *  返回结果状态码（0 表示成功，其他值由应用自定义）
     */
    private int code;

    /**
     * 返回结果描述
     */
    private String msg;

    private Object data;

    /**
     * 创建一个表示“调用成功”的 Result 对象
     *
     * @return 表示“调用成功”的 Result 对象
     */
    public static Result success() {
        Result mapResult = new Result();
        mapResult.setSuccess(true);
        return mapResult;
    }

    /**
     * 创建一个表示“调用成功”的 Result 对象
     *
     * @param message 调用结果描述
     *
     * @return 表示“调用成功”的 Result 对象
     */
    public static Result success(String message) {
        Result mapResult = new Result();
        mapResult.setSuccess(true);
        mapResult.setMsg(message);
        return mapResult;
    }

    /**
     * 创建一个表示“调用失败”的 Result 对象
     *
     * @param message 调用结果描述
     *
     * @return 表示“调用失败”的 Result 对象
     */
    public static Result fail(String message) {
        Result mapResult = new Result();
        mapResult.setSuccess(false);
        mapResult.setCode(-1);
        mapResult.setMsg(message);
        return mapResult;
    }

    /**
     * 创建一个表示“调用失败”的 Result 对象
     *
     * @param message 结果描述
     * @param code    结果代码
     *
     * @return 表示“调用失败”的 Result 对象
     */
    public static Result fail(String message, int code) {
        Result mapResult = new Result();
        mapResult.setSuccess(false);
        mapResult.setCode(code);
        mapResult.setMsg(message);
        return mapResult;
    }

    /**
     * 创建一个表示“查询结果为空”的 Result 对象
     *
     * @return 表示“查询结果为空”的 Result 对象
     */
    public static Result empty() {
        return new Result();
    }

    @SuppressWarnings("unchecked")
    public Result put(String key, Object value){
        if (data == null){
            data = new HashMap<>();
        }
        ((Map)data).put(key, value);
        return this;
    }

    public Result set(Object value){
        data = value;
        return this;
    }

    public static Result success(Object entity) {
        Result mapResult = new Result();
        mapResult.setSuccess(true);
        mapResult.setData(entity);
        return mapResult;
    }


}
